<?php

use fast\Hashids;
use fast\Random;
use fast\Http;
use think\Config;
use think\Db;

if (!function_exists('getNewOrderNo')) {
    /**
     * 使用雪花算法生成订单号
     * @param  [int]     $length   长度 整数
     * @return [string]  订单号
     */
    function getNewOrderNo($length = 16)
    {
        $n = $length - 10;
        //1、年月日
        $date = date('Ymd');
        //2、基于微秒生成随机串
        $id = uniqid();
        //3、截取随机串的随机后7位
        $sub = substr($id, 7, 13);
        //4、将随机串分割成数组
        $str_arr = str_split($sub, 1);
        //5、转换成ASCLL值,并取第一位连接成字符串
        $ascll_arr = array_map('ord', $str_arr);
        $ascll_str = implode('', $ascll_arr);
        //6、随机取连续的4位
        $max_start_index = strlen($ascll_str) - 1 - 4;
        $start_index = rand(0, $max_start_index);
        $str = substr($ascll_str, $start_index, 4);
        //7、生成末尾的n位随机数
        $rand = mt_rand('1' . str_repeat('0', $n - 1), str_repeat('9', $n));
        return $date . $str . $rand;
    }
}

if (!function_exists('noticeSend')) {
    /**
     * 发送短信通知
     * @param  [string]     $mobile   手机号
     * @param  [string]     $msg   信息
     * @return [boole]  结果
     */
    function noticeSend($mobile,$msg)
    {
        $config = get_addon_config('smsbao');

        $postArr = array(
            'u' => $config['username'],
            'p' => md5($config['password']),
            'm' => $mobile,
            'c' => $config['sign'] . $msg
        );
        $options = [
            CURLOPT_HTTPHEADER => array(
                'Content-Type: application/json; charset=utf-8'
            )
        ];
        $result = \fast\Http::sendRequest('http://api.smsbao.com/sms', $postArr, 'GET', $options);
        if ($result['ret']) {
            if (isset($result['msg']) && $result['msg'] == '0')
                return TRUE;
//            $result['msg'];
        }
        return FALSE;
    }
}

if (!function_exists('issueCoupons')) {
    /**
     * 发优惠劵
     * @param  [string]     $user_ids   用户ID
     * @param  [string]     $coupon_ids   优惠劵ID
     * @return [boole]  结果
     */
    function issueCoupons($user_ids,$coupon_ids)
    {
        if(!$user_ids || !$coupon_ids) return false;
        $user_ids = \app\admin\model\User::where(['id' => ['in',$user_ids],'status'=>'normal'])->column('id');
        $coupon_ids = \app\admin\model\Coupon::where(['id' => ['in',$coupon_ids],'deletetime'=>NULL])->column('id');

        $params = [];
        foreach($user_ids as $user_id){
            foreach($coupon_ids as $coupon_id){
                $expiretime = \app\admin\model\Coupon::where(['id' => $coupon_id])->value('expiretime');
                $params[] = [
                    'user_id' => $user_id,
                    'coupon_id' => $coupon_id,
                    'expiretime' => $expiretime
                ];
            }
        }
        try{
            $CouponUser = new \app\admin\model\CouponUser;
            $res = $CouponUser->saveAll($params);

            Db::commit();
            if($res){
                return true;
            }else{
                return false;
            }
        }catch(\Exception $e){
            Db::rollback();
//            return ['code'=>0,'message'=>$e->getMessage(),'data'=>''];
            return false;
        }
    }
}

if (!function_exists('generateUniqueNumber')) {
    /**
     * 生成唯一数字
     * @return [string]  结果
     */
    function generateUniqueNumber()
    {
        // 获取当前时间戳（毫秒级）
        $timestamp = round(microtime(true) * 1000);
        // 生成一个随机数
        $random = mt_rand(0, 999);
        // 将时间戳和随机数拼接并取模1000000，确保结果为6位数字
        $uniqueNumber = ($timestamp + $random) % 1000000;
        // 确保结果为6位数字，不足6位时前面补0
        return str_pad($uniqueNumber, 6, '0', STR_PAD_LEFT);
    }
}

if (!function_exists('arraySort')) {
    /**
     * 二维数组排序方法
     * @param  [array]     $arr    数组
     * @param  [string]     $field   字段
     * @param  [string]     $sort   排序
     * @return [string]  结果
     */
    function arraySort($arr, $field, $sort = SORT_ASC){
        $key = array_column($arr, $field);
        array_multisort($key, $sort, $arr);
        return $arr;
    }
}

if (!function_exists('getDistanceBy2Point')) {
    /**
     * 根据起点坐标和终点坐标测距离
     * @param  [array]   $from     [起点坐标(经纬度),例如:array(118.012951,36.810024)]
     * @param  [array]   $to     [终点坐标(经纬度)]
     * @param  [bool]    $km        是否以公里为单位 false:米 true:公里(千米)
     * @param  [int]     $decimal   精度 保留小数位数
     * @return [string]  距离数值
     */
    function getDistanceBy2Point($from, $to, $km = true, $decimal = 2){
        sort($from);
        sort($to);
        $EARTH_RADIUS = 6378.138; // 地球半径系数
        $distance = $EARTH_RADIUS*2*asin(sqrt(pow(sin( ($from[0]*pi()/180-$to[0]*pi()/180)/2),2)+cos($from[0]*pi()/180)*cos($to[0]*pi()/180)* pow(sin( ($from[1]*pi()/180-$to[1]*pi()/180)/2),2)))*1000;
        if($km && $distance > 1000){
            return round($distance / 1000, 2) . 'km';
        }
        return round($distance, $decimal) . 'm';
    }
}
